package fr.bludwarf.skywarrior.xml;

import java.util.ArrayList;

import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;

import fr.bludwarf.skywarrior.global.Monde;
import fr.bludwarf.skywarrior.global.Temps;
import fr.bludwarf.skywarrior.ile.Batiment;
import fr.bludwarf.skywarrior.ile.Construction;
import fr.bludwarf.skywarrior.ile.EtatIle;
import fr.bludwarf.skywarrior.ile.Ile;
import fr.bludwarf.skywarrior.joueur.EtatJoueur;
import fr.bludwarf.skywarrior.joueur.Unite;

@Root(name="ile")
public class EtatIleXML extends SubElementXML<EtatIle, EtatJoueur>
{
	@Attribute
	String nom;
	
	@Attribute(required=false)
	Integer pop;
	
	@Attribute(required=false)
	Integer nourriture;
	
	@Attribute(name="next-pop", required=false)
	String nextPop;
	
	@ElementList(name="batiments")
	ArrayList<EtatIleXMLBatiment> batiments;
	
	@ElementList(name="constructions")
	ArrayList<EtatIleXMLConstruction> constructions;

	public EtatIleXML(EtatIle etatIle) throws Exception
	{
		this();
		fromObject(etatIle);
	}

	public EtatIleXML()
	{
	}

	@Override
	public EtatIle toObject(EtatJoueur etatJoueur) throws Exception
	{
		final Monde monde = etatJoueur.getMonde();
		final Ile ile = monde.getIle(nom);
		etatJoueur.getJoueur().add(ile);
		final EtatIle obj = new EtatIle(ile, etatJoueur);
		
		for (final EtatIleXMLBatiment bat : batiments)
		{
			obj.add(bat.nb, Unite.getUnite(bat.nom));
		}
		
		for (final EtatIleXMLConstruction cons : constructions)
		{
			obj.addConstructionForXML(cons.toObject(obj));
		}
		
		obj.setPopForXML(pop);
		obj.nourritureForXML(nourriture);
		obj.setNextPopForXML(nextPop);
		
		return obj;
	}

	@Override
	public void fromObject(EtatIle obj) throws Exception
	{
		final Ile ile = obj.getIle();
		nom = ile.getNom();
		pop = obj.getPop();
		nourriture = obj.nourriture();
		nextPop = Temps.formatDuree(obj.getNextPop());
		
		batiments = new ArrayList<EtatIleXML.EtatIleXMLBatiment>();
		for (final Batiment batiment : obj.getBatiments())
		{
			final EtatIleXMLBatiment batXML = new EtatIleXMLBatiment(obj.getNb(batiment), batiment);
			batiments.add(batXML);
		}
		
		constructions = new ArrayList<EtatIleXML.EtatIleXMLConstruction>();
		for (final Construction cons : obj.getConstructions())
		{
			final EtatIleXMLConstruction consXML = new EtatIleXMLConstruction();
			consXML.fromObject(obj, cons);
			constructions.add(consXML);
		}
	}

	public void setEtatJoueur(EtatJoueur etatJoueur)
	{
		setParentObject(etatJoueur);
	}
	
	@Root(name="batiment")
	public static class EtatIleXMLBatiment
	{
		@Attribute
		private String nom;
		
		@Attribute(required=false)
		private int nb = 1;
		
		public EtatIleXMLBatiment()
		{
		}
		
		public EtatIleXMLBatiment(int nb, Batiment batiment)
		{
			nom = batiment.getNom();
			this.nb = nb;
		}
		
	}
	
	@Root(name="batiment")
	public static class EtatIleXMLConstruction
	{
		@Attribute
		private String nom;
		
		/** Si vide alors construction non commencée */
		@Attribute(name="temps-restant", required=false)
		private String tempsRestant;
		
		public EtatIleXMLConstruction()
		{
		}

		public Construction toObject(final EtatIle etatIle) throws Exception
		{
			final Construction cons = new Construction(etatIle.getIle(), Unite.getUnite(nom));
			cons.setTempsRestantForXML(tempsRestant);
			return cons;
		}

		public void fromObject(EtatIle etatIle, Construction obj) throws Exception
		{
			if (obj.aEteCommencee())
			{
				tempsRestant = Temps.formatDuree(obj.getTempsRestant(etatIle.getEtatMonde()));
			}
			nom = obj.getUnite().getNom();
		}
		
	}

}
